﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace AvaProvi
{
    [Serializable]
    public class clsTerreno_CRN:clsEstado,IControlEstados
    {

        #region Propiedades de clase
        public clsInmueble_CRN Inmueble { get; set; }
        public double FactorAjuste { get; set; }
        public string Justificacion { get; set; }
        public string Configuracion { get; set; }
        public string Topografia { get; set; }
        public string CaracteristicaPanoramica { get; set; }
        public string UsoSueloClasificacion { get; set; }
        public string UsoSueloTipo { get; set; }
        public string UsoSueloSegun { get; set; }
        public string DensidadPermitida { get; set; }
        public string Servidumbre { get; set; }
        public clsMedida_CRN Medidas { get; set; }
        public BindingList<clsFraccionDeTerreno_CRN> FraccionesDeTerreno { get; set; }
        public BindingList<clsSuperficieAccesoria_CRN> SuperficiesAccesorias { get; set; }
        public BindingList<clsAreaComun_CRN> AreasComunes { get; set; }
        public clsConstruccion_CRN Construccion { get; set; }
        public clsAnalisisFisico AnalisisFisico { get; set; }
        public clsAnalisisCapitalizacionRentas_CRN AnalisisCapRentas { get; set; }
        public bool SeRealizoLevantamiento { get; set; }
        #endregion

        #region Constructor
        public clsTerreno_CRN(clsInmueble_CRN objInmueble):base()
        {
            this.Inmueble = objInmueble;
            this.Configuracion = string.Empty;
            this.Topografia = string.Empty;
            this.CaracteristicaPanoramica = string.Empty;
            this.UsoSueloClasificacion = string.Empty;
            this.UsoSueloTipo = string.Empty;
            this.UsoSueloSegun = string.Empty;
            this.DensidadPermitida = string.Empty;
            this.Servidumbre = string.Empty;
            this.FactorAjuste = 1;
            this.Justificacion = string.Empty;
            this.Medidas = new clsMedida_CRN(this);
            this.Construccion = new clsConstruccion_CRN(this);
            this.FraccionesDeTerreno = new BindingList<clsFraccionDeTerreno_CRN>();
            this.SuperficiesAccesorias = new BindingList<clsSuperficieAccesoria_CRN>();
            this.AreasComunes = new BindingList<clsAreaComun_CRN>();
            this.AnalisisFisico = new clsAnalisisFisico(this);
            this.AnalisisCapRentas = new clsAnalisisCapitalizacionRentas_CRN(this);
            //Crea tres registros de fracciones por default
            for (int i = 0; i < 3; i++)
            {
                clsFraccionDeTerreno_CRN objFraccion = new clsFraccionDeTerreno_CRN(this);
                this.FraccionesDeTerreno.Add(objFraccion);
            }

        }
        #endregion

        #region Métodos

        public void ConvertirANuevo()
        {
            this.EsNuevo = true;
            this.Medidas.ConvertirANuevo();
            this.Construccion.ConvertirAnuevo();
            foreach (clsFraccionDeTerreno_CRN fraccionTerreno in this.FraccionesDeTerreno)
            {
                fraccionTerreno.EsNuevo = true;
            }
            foreach (clsSuperficieAccesoria_CRN superficieAccesoria in this.SuperficiesAccesorias)
            {
                superficieAccesoria.EsNuevo = true;
            }
            foreach (clsAreaComun_CRN areaComun in this.AreasComunes)
            {
                areaComun.EsNuevo = true;
            }
            this.AnalisisCapRentas.EsNuevo = true;
        }

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return NuevoTerreno();
                else
                {
                    if (this.EsModificado)
                        return ModificaTerreno();
                    else
                        return EliminaTerreno();
                }
            }
            return false;
        }

        private bool EliminaTerreno()
        {
            clsTerreno_CD objTerreno_CD = new clsTerreno_CD();
            return objTerreno_CD.EliminaTerreno(this);
        }

        private bool ModificaTerreno()
        {
            clsTerreno_CD objTerreno_CD = new clsTerreno_CD();
            if (objTerreno_CD.ModificaTerreno(this))
            {
                this.Medidas.Guardar();
                foreach (clsFraccionDeTerreno_CRN objFraccion in this.FraccionesDeTerreno)
                {
                    objFraccion.Guardar();
                }
                foreach (clsSuperficieAccesoria_CRN objSuperficie in this.SuperficiesAccesorias)
                {
                    objSuperficie.Guardar();
                }
                this.SuperficiesAccesorias = clsSuperficieAccesoria_CRN.RecuperaSuperficiesAccesoriasDeTerreno(this);
                foreach (clsAreaComun_CRN objArea in this.AreasComunes)
                {
                    objArea.Guardar();
                }
                this.AreasComunes = clsAreaComun_CRN.RecuperaAreasComunesDeTerreno(this);
                this.Construccion.Guardar();
                this.AnalisisCapRentas.Guardar();
                return true;
            }
            return false;
        }

        private bool NuevoTerreno()
        {
            clsTerreno_CD objTerreno_CD = new clsTerreno_CD();
            if (objTerreno_CD.CreaTerreno(this))
            {
                this.EsModificado = true;
                this.Medidas.Guardar();
                foreach (clsFraccionDeTerreno_CRN objFraccion in this.FraccionesDeTerreno)
                {
                    objFraccion.Guardar();
                }
                this.FraccionesDeTerreno = clsFraccionDeTerreno_CRN.RecuperaFraccionesDeTerreno(this);
                foreach (clsSuperficieAccesoria_CRN objSuperficie in this.SuperficiesAccesorias)
                {
                    objSuperficie.Guardar();
                }
                this.SuperficiesAccesorias = clsSuperficieAccesoria_CRN.RecuperaSuperficiesAccesoriasDeTerreno(this);
                foreach (clsAreaComun_CRN objArea in this.AreasComunes)
                {
                    objArea.Guardar();
                }
                this.AreasComunes = clsAreaComun_CRN.RecuperaAreasComunesDeTerreno(this);
                this.Construccion.Guardar();
                this.AnalisisCapRentas.Guardar();
                return true;
            }
            return false;
        }

        public bool DatosValidos()
        {
            return true;
        }

        public static clsTerreno_CRN RecuperaTerreno(clsInmueble_CRN objInmueble)
        {
            clsTerreno_CRN objTerreno = new clsTerreno_CRN(objInmueble);
            clsTerreno_CD objTerreno_CD = new clsTerreno_CD();
            dsTerreno.TerrenoRow objTerrenoRecuperado = objTerreno_CD.RecuperaTerreno(objInmueble.Avaluo.IdAvaluo);
            if (objTerrenoRecuperado != null)
            {
                objTerreno.CaracteristicaPanoramica = objTerrenoRecuperado.CaracPanoramica;
                objTerreno.Configuracion = objTerrenoRecuperado.Configuracion;
                objTerreno.DensidadPermitida = objTerrenoRecuperado.DensidadPermitida;
                objTerreno.EsModificado = true;
                objTerreno.SeRealizoLevantamiento = objTerrenoRecuperado.SeRealizoLevantamiento;
                objTerreno.Servidumbre = objTerrenoRecuperado.Servidumbre;
                objTerreno.Topografia = objTerrenoRecuperado.Topografia;
                objTerreno.UsoSueloClasificacion = objTerrenoRecuperado.UsoSueloClasificacion;
                objTerreno.UsoSueloSegun = objTerrenoRecuperado.UsoSueloSegun;
                objTerreno.UsoSueloTipo = objTerrenoRecuperado.UsoSueloTipo;
                objTerreno.FactorAjuste = objTerrenoRecuperado.FactorAjuste;
                objTerreno.Justificacion = objTerrenoRecuperado.Justificacion;
                objTerreno.Medidas = clsMedida_CRN.RecuperaMedida(objTerreno);
                objTerreno.Construccion = clsConstruccion_CRN.RecuperaConstruccion(objTerreno);
                objTerreno.SuperficiesAccesorias = clsSuperficieAccesoria_CRN.RecuperaSuperficiesAccesoriasDeTerreno(objTerreno);
                objTerreno.AreasComunes = clsAreaComun_CRN.RecuperaAreasComunesDeTerreno(objTerreno);
                objTerreno.AnalisisCapRentas = clsAnalisisCapitalizacionRentas_CRN.RecuperaAnalisis(objTerreno);
                BindingList<clsFraccionDeTerreno_CRN> blFracciones = clsFraccionDeTerreno_CRN.RecuperaFraccionesDeTerreno(objTerreno);
                if (blFracciones.Count > 0)
                {
                    objTerreno.FraccionesDeTerreno = new BindingList<clsFraccionDeTerreno_CRN>();
                    objTerreno.FraccionesDeTerreno = blFracciones;
                }
            }
            return objTerreno;
        }

        #endregion
    }
}
